

package GUI;

/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 */


import Interaction.ServerConnection;
import Data.*;
import Flightadministration.Flightadministration;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.*;
import java.rmi.RemoteException;
// Quelle: http://nachocalendar.sourceforge.net/
import net.sf.nachocalendar.CalendarFactory;
import net.sf.nachocalendar.components.DateField;
import javax.swing.DefaultComboBoxModel;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class FlightRealizationEdit extends JPanel {

    final Main td;
    private JPanel jp;
    Date d = new Date();
    SimpleDateFormat s = new SimpleDateFormat();
    public JLabel label3;
    public JLabel label5;
    public JLabel label7;
    public JLabel label9;
    public JLabel label11;
    public JLabel label13;
    public JLabel label15;
    public JLabel label19;
    public JLabel label23;
    public JComboBox comboBox1;
    public DefaultComboBoxModel model1;
    public Vector<String> allAircraftNames = new Vector<String>();
    public Vector<Airline> allAirlines;
    public Vector<Aircraft> allAvailableAircrafts;
    public DateField datefield1;
    public DateField datefield2;


    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
     *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();


    // Konstruktor
    public FlightRealizationEdit(final Main td) throws RemoteException {
        this.td = td;
        showFlightRealizationEdit();
    }


    // Methoden
    public void showFlightRealizationEdit() throws RemoteException {

        jp = new JPanel();

        //GridBagLayout
        //**********************************************************************
        GridBagLayout gbl = new GridBagLayout();
        jp.setLayout(gbl);
        jp.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 1;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren


        //Label
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Flugdurchführung bearbeiten</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 4;
        jp.add(headline, constraints);

        final JLabel label2 = new JLabel("Flugdurchführungsnummer: ");
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 1;
        jp.add(label2, constraints);

        label3 = new JLabel();
        label3.setBorder(BorderFactory.createLineBorder(Color.black));
        constraints.gridx = 1;
        constraints.gridy = 1;
        jp.add(label3, constraints);

        final JLabel label22 = new JLabel("Flugnummer: ");
//        constraints.gridx = 2;
//        constraints.gridy = 1;
//        constraints.gridwidth = 1;
//        jp.add(label22, constraints);

        label23 = new JLabel();
//        label23.setBorder(BorderFactory.createLineBorder(Color.black));
//        constraints.gridx = 3;
//        constraints.gridy = 1;
//        jp.add(label23, constraints);

        JLabel label4 = new JLabel("Abflugzeitpunkt: ");
        constraints.gridx = 0;
        constraints.gridy = 2;
        jp.add(label4, constraints);

        label5 = new JLabel();
        label5.setBorder(BorderFactory.createLineBorder(Color.black));
        constraints.gridx = 1;
        constraints.gridy = 2;
        jp.add(label5, constraints);

        JLabel label6 = new JLabel("Ankunftzeitpunkt: ");
        constraints.gridx = 2;
        constraints.gridy = 2;
        jp.add(label6, constraints);

        label7 = new JLabel();
        label7.setBorder(BorderFactory.createLineBorder(Color.black));
        constraints.gridx = 3;
        constraints.gridy = 2;
        jp.add(label7, constraints);

        JLabel label8 = new JLabel("Abflughafen: ");
        constraints.gridx = 0;
        constraints.gridy = 3;
        jp.add(label8, constraints);

        label9 = new JLabel();
        label9.setBorder(BorderFactory.createLineBorder(Color.black));
        constraints.gridx = 1;
        constraints.gridy = 3;
        jp.add(label9, constraints);

        JLabel label10 = new JLabel("Zielflughafen: ");
        constraints.gridx = 2;
        constraints.gridy = 3;
        jp.add(label10, constraints);

        label11 = new JLabel();
        label11.setBorder(BorderFactory.createLineBorder(Color.black));
        constraints.gridx = 3;
        constraints.gridy = 3;
        jp.add(label11, constraints);

        JLabel label12 = new JLabel("Fluglinie: ");
        constraints.gridx = 0;
        constraints.gridy = 4;
        jp.add(label12, constraints);

        label13 = new JLabel();
        label13.setBorder(BorderFactory.createLineBorder(Color.black));
        constraints.gridx = 1;
        constraints.gridy = 4;
        jp.add(label13, constraints);

        JLabel label14 = new JLabel("Abflugwochentag: ");
        constraints.gridx = 2;
        constraints.gridy = 1;
        jp.add(label14, constraints);

        label15 = new JLabel();
        label15.setBorder(BorderFactory.createLineBorder(Color.black));
        constraints.gridx = 3;
        constraints.gridy = 1;
        jp.add(label15, constraints);

        JLabel label16 = new JLabel("Abflugdatum festlegen: ");
        constraints.gridx = 0;
        constraints.gridy = 5;
        jp.add(label16, constraints);

        datefield1 = CalendarFactory.createDateField();
        constraints.gridx = 1;
        constraints.gridy = 5;
        jp.add(datefield1, constraints);

        JLabel label17 = new JLabel("Ankunftsdatum festlegen: ");
        constraints.gridx = 2;
        constraints.gridy = 5;
        jp.add(label17, constraints);

        datefield2 = CalendarFactory.createDateField();
        constraints.gridx = 3;
        constraints.gridy = 5;
        jp.add(datefield2, constraints);

        JLabel label18 = new JLabel("Flugzeug: ");
        constraints.gridwidth = 1;
        constraints.gridx = 2;
        constraints.gridy = 4;
        jp.add(label18, constraints);

        label19 = new JLabel();
        constraints.gridwidth = 1;
        constraints.gridx = 3;
        constraints.gridy = 4;
        label19.setBorder(BorderFactory.createLineBorder(Color.black));
        jp.add(label19, constraints);


        //Buttons
        //**********************************************************************

        JButton button_UpdateFlightRealization = new JButton("Änderungen speichern");
        constraints.gridx = 0;
        constraints.gridy = 7;
        constraints.gridwidth = 2;
        jp.add(button_UpdateFlightRealization, constraints);

        JButton button_Cancel = new JButton("Zurück zur Übersicht");
        constraints.gridx = 2;
        constraints.gridy = 7;
        constraints.gridwidth = 2;
        jp.add(button_Cancel, constraints);

        //Action Listener
        //**********************************************************************

        /**
         * ActionListener liest das Datum des Abfluges aus und
         * übernimmt dieses in das Datumsfeld für das Ankunftsdatum
         */
        datefield1.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
            public void propertyChange(PropertyChangeEvent evt) {
                // Datum des Abflugtermins auslesen und in Datumsfeld für Ankunft übernehmen
                Object chosenDate = datefield1.getValue();
                datefield2.setValue(chosenDate);
            }
        });


        button_UpdateFlightRealization.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                if (datefield1.getValue().equals("")) {
                    JOptionPane.showMessageDialog(null, "Bitte alle Felder ausfüllen!");
                }
                else {
                    try {
                        // FlightRealization ID von String in int
                        String id = label3.getText();
                        int idAsInt = Integer.parseInt(id);
                        // Flight ID von String in int
                        String flightId = label23.getText();
                        int flightIdAsInt = Integer.parseInt(flightId);
                        Flight f = admin.getFlightById(flightIdAsInt);
                        /** Erzeugung eines Flightrealizationobjekts(fR), um auf
                        /* die Methode getIdOfRelatedAircraft zugreifen zu können */
                        FlightRealization fR = admin.getFlightRealizationById(idAsInt);

                        // Abflugdatum aus datefield auslesen
                        Date departureDate = (Date) datefield1.getValue();
                        // Ankunftsdatum aus datefield auslesen
                        Date arrivalDate = (Date) datefield2.getValue();

                        // Vector mit allen Fluglinien aus der Datenbank befüllen
                        allAirlines = admin.getAllAirlinesForComboBox();
                        // Über nachfolgende for-Schleife die Id der betroffenen Fluglinie auslesen und in Integervariable speichern
                        int airlineId = 0;

                            for(int i = 0; i<allAirlines.size(); i++) {
                                if (allAirlines.get(i).getAirName().equals(label13.getText())) {
                                    airlineId = allAirlines.get(i).getAirId();
                                }
                            }

                        // Vector erzeugen in den alle zum ausgewählten Zeitpunkt verfügbaren Flugzeuge aus der Datenbank gespeichert werden
                        allAvailableAircrafts = admin.getAllAircraftsByAvailabilityForComboBox(departureDate, arrivalDate, airlineId);

                        // Über die nachfolgende for-Schleife werden die Bezeichnungen aller Flugzeuge in den Vector gespeichert
                        for(int i = 0; i<allAvailableAircrafts.size(); i++) {
                            // Bezeichnung des aktuellen Flugzeugtypes auslesen und in Stringvariable speichern
                            String aircraftName = String.valueOf(allAvailableAircrafts.get(i).getCraftName());
                            // Stringvariable in Vector speichern
                            allAircraftNames.add(aircraftName);
                        }

                        /* Array mit Wochentagen um den Wochentag des Abflugdatums (departureDate) zu ermitteln */
                        String[] weekdays = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};

                            /* Dateobjekt mittels Abflugdatum (dateOfDeparture) erstellen und Wochentag als Integer auslesen */
                            Date d = departureDate;
                            int indexOfWeekday = d.getDay();

                                /* Stringobjekt für den Abflugtag erzeugen indem der Wochentag des Integerwertes (indexOfWeekday)
                                 * aus dem Array mit den Wochentagen ausgelesen wird. */
                                String dayOfDepartureFromArray = new String(weekdays[indexOfWeekday]);
                                /* Stringobjekt für den Abflugtag erzeugen, in dem der Abflugtag der ausgewählten FlightId aus der Datenbank ausgelesen wird */
                                String dayOfDepartureFromDB = f.getDayOfDeparture();

                        /* Abfrage ob Wochentag des ausgewählten Startdatums des Fluges (FlightRealization)
                         * sowie der Wochentag des Fluges (Flight) im Flugplan übereinstimmen. */
                        if(dayOfDepartureFromArray.equals(dayOfDepartureFromDB)) {

                            // Prüfen ob das Flugzeug auch am ausgewählten Datum zur Verfügung steht
                            if(allAircraftNames.contains(label19.getText())) {

                                admin.updateFlightRealization(idAsInt, departureDate, arrivalDate, flightIdAsInt, fR.getIdOfRelatedAircraft());

                                // Tables aktualisieren
                                td.updateFlightRealization();

                                JOptionPane.showMessageDialog(null, "Flugdurchführung geändert");

                                ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightRealizationM");
                            }
                            else {

                                 JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                     "Bitte wählen Sie ein anderes Datum aus da das Flugzeug<br>" +
                                                                     "an dem von Ihnen gewünschten nicht zur Verfügung steht</p></html>");
                            }
                        }
                        else {
                            JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                        "Leider konnte diese Flugdurchführung nicht geändert werden.<br>" +
                                                                        "Bitte wählen Sie ein Datum an einem " + dayOfDepartureFromDB + " aus.</p></html>");
                        }

                    } catch (RemoteException ex) {
                        Logger.getLogger(FlightRealizationEdit.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });


        button_Cancel.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                ((CardLayout) td.rightp.getLayout()).show(td.rightp,"FlightRealizationM");
            }
        });

    }

    
    public JPanel getJp() {
        return jp;
    }
}

